package com.chushouya.product.service.admin.impl;

import com.chushouya.product.dto.admin.tempevaluate.*;
import com.general.framework.core.exception.Ex;
import com.general.framework.core.lang.Beans;
import com.general.framework.core.lang.Check;
import com.general.framework.core.lang.Numbers;
import com.general.framework.core.schema.PageResult;
import com.chushouya.product.dao.entity.EvaluateItemValueEntity;
import com.chushouya.product.dao.entity.TempEvaluateItemEntity;
import com.chushouya.product.dao.entity.TempEvaluateItemValueEntity;
import com.chushouya.product.dao.repository.TempEvaluateItemValueRepository;
import com.chushouya.product.dao.repository.TempEvaluateItemRepository;
import com.chushouya.product.dao.repository.EvaluateItemValueRepository;
import com.chushouya.product.dao.repository.EvaluateItemRepository;
import com.chushouya.product.dto.admin.evaluateitem.EvaluateItemValueQuery;
import com.chushouya.product.dto.admin.product.evaluate.TempItemDTO;
import com.chushouya.product.dto.admin.product.evaluate.TempEvaluateItemValueEditDTO;
import com.chushouya.product.dto.admin.product.evaluate.TempItemValueDTO;
//=====product.dto.admin.tempevaluate.*;
import com.chushouya.product.dto.admin.tempevaluate.*;
import com.chushouya.product.service.admin.TempEvaluateItemValueService;
import com.chushouya.product.dto.admin.product.evaluate.TempEvaluateItemAddSingleDTO;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Objects;

/**
 * 模板估价项目选项业务实现
 */
@Service
public class TempEvaluateItemValueServiceImpl implements TempEvaluateItemValueService {

    @Resource
    private TempEvaluateItemValueRepository tempEvaluateItemValueRepository;

    @Resource
    private TempEvaluateItemRepository tempEvaluateItemRepository;

    @Resource
    private EvaluateItemValueRepository evaluateItemValueRepository;

    @Resource
    private EvaluateItemRepository evaluateItemRepository;

    @Override
    public PageResult<TempEvaluateItemValueListDTO> selectTempEvaluateItemValuePageResult(TempEvaluateItemValueQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        PageResult<TempEvaluateItemValueEntity> pageResult = tempEvaluateItemValueRepository.selectPageResult(query);
        return PageResult.of(pageResult, TempEvaluateItemValueListDTO.class);
    }

    @Override
    public List<TempEvaluateItemValueListDTO> selectTempEvaluateItemValueList(TempEvaluateItemValueQuery query) {
        Check.notNull(query, "查询参数不能为空");
        
        List<TempEvaluateItemValueEntity> list = tempEvaluateItemValueRepository.selectList(query);
        return Beans.copyList(list, TempEvaluateItemValueListDTO.class);
    }

    @Override
    public TempEvaluateItemValueDetailDTO getTempEvaluateItemValueDetail(Long tempItemValueId) {
        Check.notNull(tempItemValueId, "模板估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity entity = tempEvaluateItemValueRepository.selectByPrimaryKey(tempItemValueId);
        Check.notNull(entity, "模板估价项目选项不存在");
        
        return Beans.copy(entity, TempEvaluateItemValueDetailDTO.class);
    }

    @Override
    public Long addTempEvaluateItemValue(TempEvaluateItemValueSaveDTO tempEvaluateItemValue) {
        Check.notNull(tempEvaluateItemValue, "模板估价项目选项信息不能为空");
        Check.notNull(tempEvaluateItemValue.getTempItemId(), "模板估价项目ID不能为空");
        Check.notNull(tempEvaluateItemValue.getValueId(), "估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity entity = Beans.copy(tempEvaluateItemValue, TempEvaluateItemValueEntity.class);
        
        tempEvaluateItemValueRepository.insertSelective(entity);
        return entity.getTempItemValueId();
    }

    @Override
    public Long editTempEvaluateItemValue(TempEvaluateItemValueUpdateDTO tempEvaluateItemValue) {
        Check.notNull(tempEvaluateItemValue, "模板估价项目选项信息不能为空");
        Check.notNull(tempEvaluateItemValue.getTempItemValueId(), "模板估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity existEntity = tempEvaluateItemValueRepository.selectByPrimaryKey(tempEvaluateItemValue.getTempItemValueId());
        Check.notNull(existEntity, "模板估价项目选项不存在");
        
        TempEvaluateItemValueEntity entity = Beans.copy(tempEvaluateItemValue, TempEvaluateItemValueEntity.class);
        
        tempEvaluateItemValueRepository.updateByPrimaryKeySelective(entity);
        return entity.getTempItemValueId();
    }

    @Override
    public void removeTempEvaluateItemValue(Long tempItemValueId) {
        Check.notNull(tempItemValueId, "模板估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity existEntity = tempEvaluateItemValueRepository.selectByPrimaryKey(tempItemValueId);
        Check.notNull(existEntity, "模板估价项目选项不存在");
        
        tempEvaluateItemValueRepository.deleteByPrimaryKey(tempItemValueId);
    }

    @Override
    public List<TempEvaluateItemValueListDTO> selectTempEvaluateItemValueListByTempItemId(Long tempItemId) {
        Check.notNull(tempItemId, "模板估价项目ID不能为空");
        
        TempEvaluateItemValueQuery query = new TempEvaluateItemValueQuery();
        query.setTempItemId(tempItemId);
        
        List<TempEvaluateItemValueEntity> list = tempEvaluateItemValueRepository.selectList(query);
        return Beans.copyList(list, TempEvaluateItemValueListDTO.class);
    }

    @Override
    public List<TempEvaluateItemValueListDTO> selectTempEvaluateItemValueListByValueId(Long valueId) {
        Check.notNull(valueId, "估价项目选项ID不能为空");
        
        TempEvaluateItemValueQuery query = new TempEvaluateItemValueQuery();
        query.setValueId(valueId);
        
        List<TempEvaluateItemValueEntity> list = tempEvaluateItemValueRepository.selectList(query);
        return Beans.copyList(list, TempEvaluateItemValueListDTO.class);
    }

    @Override
    public List<TempItemDTO> getTempItemsByTempId(Long tempId) {
        Check.notNull(tempId, "模板ID不能为空");
        
        // 1. 查询模板下的所有估价项目
        TempEvaluateItemQuery itemQuery = new TempEvaluateItemQuery();
        itemQuery.setTempId(tempId);
        
        List<TempEvaluateItemEntity> tempItemList = tempEvaluateItemRepository.selectList(itemQuery);
        
        List<TempItemDTO> resultList = new java.util.ArrayList<>();
        
        // 2. 遍历每个估价项目，查询其选项值
        for (TempEvaluateItemEntity tempItem : tempItemList) {
            TempItemDTO tempItemDTO = new TempItemDTO();
            tempItemDTO.setTempItemId(tempItem.getTempItemId());
            tempItemDTO.setItemId(tempItem.getItemId());
            tempItemDTO.setItemName(tempItem.getItemName());
            
            // 查询该项目下的所有选项值
            TempEvaluateItemValueQuery valueQuery = new TempEvaluateItemValueQuery();
            valueQuery.setTempItemId(tempItem.getTempItemId());
            
            List<TempEvaluateItemValueEntity> valueList = tempEvaluateItemValueRepository.selectList(valueQuery);
            
            List<TempItemValueDTO> tempItemValueList = new java.util.ArrayList<>();
            for (TempEvaluateItemValueEntity valueEntity : valueList) {
                TempItemValueDTO valueDTO = new TempItemValueDTO();
                valueDTO.setTempItemValueId(valueEntity.getTempItemValueId());
                valueDTO.setValueId(valueEntity.getValueId());
                valueDTO.setValueName(valueEntity.getValueName());
                valueDTO.setValue(valueEntity.getValue());
                valueDTO.setSort(valueEntity.getSort());
                tempItemValueList.add(valueDTO);
            }
            
            tempItemDTO.setTempItemValueList(tempItemValueList);
            resultList.add(tempItemDTO);
        }
        
        return resultList;
    }

    @Override
    public Boolean updateTempEvaluateItemValuePrice(TempEvaluateItemValueEditDTO editDTO) {
        Check.notNull(editDTO, "编辑参数不能为空");
        Check.notNull(editDTO.getTempItemValueId(), "模板估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity existEntity = tempEvaluateItemValueRepository.selectByPrimaryKey(editDTO.getTempItemValueId());
        Check.notNull(existEntity, "模板估价项目选项不存在");
        
        TempEvaluateItemValueEntity entity = new TempEvaluateItemValueEntity();
        entity.setTempItemValueId(editDTO.getTempItemValueId());
        entity.setValue(editDTO.getValue());
        entity.setValueName(editDTO.getValueName());
        
        return tempEvaluateItemValueRepository.updateByPrimaryKeySelective(entity) > 0;
    }

    @Override
    public Boolean deleteTempEvaluateItemByTempItemId(Long tempItemId, Long tempId) {
        Check.notNull(tempItemId, "模板估价项目ID不能为空");
        Check.notNull(tempId, "模板ID不能为空");
        
        // 1. 删除该模板估价项目下的所有选项值
        TempEvaluateItemValueQuery valueQuery = new TempEvaluateItemValueQuery();
        valueQuery.setTempItemId(tempItemId);
        List<TempEvaluateItemValueEntity> valueList = tempEvaluateItemValueRepository.selectList(valueQuery);
        
        for (TempEvaluateItemValueEntity valueEntity : valueList) {
            tempEvaluateItemValueRepository.deleteByPrimaryKey(valueEntity.getTempItemValueId());
        }
        
        // 2. 删除模板估价项目
        tempEvaluateItemRepository.deleteByPrimaryKey(tempItemId);
        
        return true;
    }

    @Override
    public Boolean deleteTempEvaluateItemValueById(Long tempItemValueId) {
        Check.notNull(tempItemValueId, "模板估价项目选项ID不能为空");
        
        TempEvaluateItemValueEntity existEntity = tempEvaluateItemValueRepository.selectByPrimaryKey(tempItemValueId);
        Check.notNull(existEntity, "模板估价项目选项不存在");
        
        return tempEvaluateItemValueRepository.deleteByPrimaryKey(tempItemValueId) > 0;
    }

    @Override
    public Boolean addTempEvaluateItemSingle(TempEvaluateItemAddSingleDTO addSingleDTO) {
        Check.notNull(addSingleDTO, "添加参数不能为空");
        Check.notNull(addSingleDTO.getTempId(), "模板ID不能为空");
        Check.notNull(addSingleDTO.getEvaluateValueId(), "估价项目选项ID不能为空");
        
        final Long tempId = addSingleDTO.getTempId();
        final Long evaluateValueId = addSingleDTO.getEvaluateValueId();
        
        // 1. 根据evaluateValueId获取对应的evaluate_item_value信息
        EvaluateItemValueQuery valueQuery = new EvaluateItemValueQuery();
        valueQuery.setEvaluateValueId(evaluateValueId);
        EvaluateItemValueEntity evaluateItemValue = evaluateItemValueRepository.selectOne(valueQuery);
        
        if (java.util.Objects.isNull(evaluateItemValue)) {
            throw Ex.business("估价项目选项不存在");
        }
        
        final Long evaluateItemId = evaluateItemValue.getEvaluateItemId();
        
        // 2. 检查模板下是否已存在该估价项目
        TempEvaluateItemQuery itemQuery = new TempEvaluateItemQuery();
        itemQuery.setTempId(tempId);
        itemQuery.setItemId(evaluateItemId);
        TempEvaluateItemEntity tempEvaluateItem = tempEvaluateItemRepository.selectOne(itemQuery);
        
        if (Objects.isNull(tempEvaluateItem)) {
            throw Ex.business("该模板下不存在对应的估价项目，无法添加选项");
        }
        Long tempItemId = tempEvaluateItem.getTempItemId();
        
        // 4. 检查是否已存在该选项值
        TempEvaluateItemValueQuery existValueQuery = new TempEvaluateItemValueQuery();
        existValueQuery.setTempItemId(tempItemId);
        existValueQuery.setValueId(evaluateValueId);
        TempEvaluateItemValueEntity existValue = tempEvaluateItemValueRepository.selectOne(existValueQuery);
        
        if (java.util.Objects.nonNull(existValue)) {
            throw Ex.business("该估价项目选项已存在");
        }
        
        // 5. 创建模板估价项目选项
        TempEvaluateItemValueEntity entity = new TempEvaluateItemValueEntity();
//        entity.setTempId(tempId);
        entity.setTempItemId(tempItemId);
//        entity.setEvaluateItemName(evaluateItemValue.getEvaluateItemName());
        entity.setValueId(evaluateItemValue.getEvaluateValueId());
        entity.setValueName(evaluateItemValue.getValueContent());
        entity.setValue(BigDecimal.ZERO);
        entity.setCalcType(Numbers.INTEGER_ONE);
        entity.setSort(evaluateItemValue.getSort());
//        entity.setStatus(com.chushouya.framework.core.enums.StatusEnum.normal.value());
//        entity.setCreateTime(new java.util.Date());
        
        return tempEvaluateItemValueRepository.insertSelective(entity) > 0;
    }
}
